home *** CD-ROM | disk | FTP | other *** search
- {$A-,B-,D+,F-,G+,I-,K-,L+,N-,P-,Q-,R-,S-,T-,V+,W-,X+,Y+}
- {$M 8192,8192}
- {************************************************}
- { }
- { Turbo Pascal for Windows }
- { Screen Saver Demo for Windows }
- { Copyright (c) 1992 by Thomas H÷vel }
- { Requires 'The Lights Go Down' }
- { }
- {************************************************}
-
- {
- Diese Datei zeigt das Grundgeruest eines LGD-Bildschirmschoners.
-
- LGD sucht nach Dateien, die dem Schema SS_*.LGD entsprechen. Die .LGD-
- Dateien sind normale .DLLs, die lediglich umbenannt wurden.
-
- Tip für TPW: In der Datei WEEP.INI kann im Abschnitt [LGD] der Eintrag
- Debug=1 eingefügt werden. Danach sucht LGD nach SS_*.DLL, d.h. zum Testen
- muß die DLL nicht mehr umbenannt werden.
-
- Grundsaetzlicher Aufbau:
-
- Die .DLL (spaeter SS_*.LGD genannt) stellt folgende vier Funktionen
- zur Verfügung:
- ScreenSaverID index 17
- ScreenSaverOptions index 18
- ScreenSaver index 19
- ScreenSaverAbout index 20
-
- ScreenSaverID dient zur Identifikation. Sie übergibt Namen und Beschreibung
- des Schoners und zeigt an, welche Funktionen unterstützt werden.
- ScreenSaver ist der eigentliche Schoner. In der Regel wird diese Funktion
- eine Fensterklasse eintragen, ein Fenster oeffnen und auf WM_QUIT warten.
- ScreenSaverAbout ist eine optionale Funktion. Sie ermöglicht dem Autor
- eines Schoner-Moduls eine angemessene Selbstdarstellung.
- ScreenSaverOptions erlaubt dem Benutzer, bestimmte Parameter des Schoners
- zu veraendern. Diese Parameter sollten in einer .INI-Datei gespeichert
- werden. Diese Funktion ist optional.
-
- Die Parameter der einzelnen Funktionen werden weiter unten beschrieben.
-
- }
-
- { $define COL256} { unterstⁿtzung fⁿr farbpalette mit 256 farben }
-
- { $define RUN} { mit RUN: standalone (.EXE), sonst .DLL }
- {$ifndef RUN}
- library ss_Demo;
- {$endif}
-
- {$c preload}
-
- uses
- {$ifdef COL256}
- ssCommon, { definitionen fⁿr farbpalette }
- {$endif}
- WinTypes, WinProcs, lm_lgd, strings;
-
- const AppName = 'LGD_DEMO';
-
- var
- lEndTime: LongInt; { zeitdauer (fⁿr Randomizer) }
- fExit: LongInt; { ende durch eingabe ? }
- {$ifdef COL256}
- pif: PInterFace; { zeiger auf parameterstruktur (von LGD ⁿbergeben) }
- fFirstDC: boolean;
- {$endif}
-
-
- { WindowProc des Bildschirmschoners }
- { In der Regel wird der Schoner über WM_TIMER bzw. über PeekMessage bestimmte
- Zeichenaktionen ausloesen.
- }
-
- function WindowProc(Window: HWnd; Message, WParam: Word;
- LParam: Longint): Longint; export;
- var
- hMen: hMenu;
- fFlag: Bool;
- w: Word;
- ps: TPaintStruct;
- dc: HDC;
- lRet: LongInt;
- begin
- WindowProc := 0;
- if (LgdDefProc (lRet, window, Message, wParam, lParam)) then
- begin
- WindowProc := lRet;
- exit;
- end;
-
- case Message of
- wm_Paint:
- begin
- dc := BeginPaint (window, ps);
- {$ifdef COL256}
- if fFirstDC then
- begin
- UnrealizeObject(pif^.hPal);
- RealizePalette(dc);
- fFirstDC := FALSE;
- { es gibt wahrscheinlich elegantere wege, dies zu erledigen ...
- ... vielleicht mit WM_QUERYNEWPALETTE ...
- wir arbeiten dran ... }
- end;
- {$endif}
- { hier: eigene zeichenroutinen einbauen }
- EndPaint (window, ps);
- exit;
- end;
-
- wm_Create:
- begin
- end;
-
- { wm_EraseBkgnd:
- begin
- WindowProc := 1;
- exit;
- end;}
-
- wm_Size:
- begin
- { cxClient := LOWORD (lParam);
- cyClient := HIWORD (lParam);
- exit;}
- end;
-
- wm_Timer:
- begin
- if GetCurrentTime >= lEndTime then
- begin
- fExit := 0;
- DestroyWindow (window);
- exit;
- end;
- end;
-
- wm_KillFocus:
- begin
- if fExit = -1 then
- begin { ende vorbereiten }
- PostMessage (window, wm_Close, 0, 0);
- end;
- end;
-
-
- wm_KeyDown, { jeder tastendruck beendet den Saver }
- wm_Close,
- wm_lButtonDown,
- wm_mButtonDown,
- wm_rButtonDown:
- begin
- fExit := 1; { randomizer mu▀ zwischen timeout und abbruch unterscheiden k÷nnen! }
- DestroyWindow (window);
- exit;
- end;
-
- wm_Destroy:
- begin
- KillTimer (window, 1000);
- PostQuitMessage(0);
- Exit;
- end;
- end;
- WindowProc := DefWindowProc(Window, Message, WParam, LParam);
- end;
-
-
- { ScreenSaver - duration: Laufzeit (in Sekunden, <= 0 -> unendlich
- Flags : reserviert
- }
-
- Function ScreenSaver (duration: LongInt; Flags:LongInt): LongInt;
- {$ifndef RUN}
- export;
- {$endif}
- var
- Window: HWnd;
- Message: TMsg;
- f:boolean;
- cCursor, i: integer;
- const
- WindowClass: TWndClass = (
- style: cs_HREDRAW + cs_VREDRAW;
- lpfnWndProc: @WindowProc;
- cbClsExtra: 0;
- cbWndExtra: 0;
- hInstance: 0;
- hIcon: 0;
- hCursor: 0;
- hbrBackground: 0;
- lpszMenuName: nil;
- lpszClassName: AppName);
- begin
- Randomize;
- fExit := -1;
- {$ifdef COL256}
- pif := pointer (flags);
- if pif <> nil then
- if (pif^.lLevel <> 0) or
- (pif^.lMagic <> $12348765) then
- pif := nil; { struktur nicht erkannt }
- fFirstDC := TRUE;
- {$endif}
-
- if HPrevInst = 0 then
- begin
- WindowClass.hInstance := HInstance;
- WindowClass.hIcon := 0;
- WindowClass.hCursor := LoadCursor(0, idc_Cross);
- WindowClass.hbrBackground := GetStockObject(black_Brush);
- if not RegisterClass(WindowClass) then
- ;
- end;
- Window := CreateWindow(
- AppName,
- AppName,
- ws_PopUp or ws_Border,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- HInstance,
- nil);
- UpdateWindow(Window);
- SetWindowPos (Window, 0, -1, -1,
- GetSystemMetrics (sm_cxScreen)+2,
- GetSystemMetrics (sm_cyScreen)+2,
- swp_noZOrder);
-
- ShowWindow (window, sw_Normal);
-
- cCursor := 0;
- repeat
- i := ShowCursor (false);
- inc (cCursor);
- until i < 0;
-
- if duration > 0 then
- lEndTime := GetCurrentTime + duration * 1000
- else
- lEndTime := $7fffffff;
- SetTimer (window, 17, 1000, nil);
-
- while GetMessage(Message, 0, 0, 0) do
- begin
- { if (TranslateAccelerator (window, hAccel, Message) = 0) then
- begin}
- TranslateMessage(Message);
- DispatchMessage(Message);
- { end;}
- end;
-
- while cCursor > 0 do
- begin
- ShowCursor (true);
- dec (cCursor);
- end;
-
- UnregisterClass (AppName, hInstance);
- ScreenSaver := fExit;
- end;
-
-
- { ScreenSaverID - Identifikation des Schoners
- Parameter:
- wMagic : muß bei der Rückkehr einen bestimmten Wert enthalten ($6874)
- fFunctions: Bit 0 About-Funktion wird unterstützt
- Bit 1 Options-Funktion wird unterstützt
- achName : Name des Schoners - daß erste Zeichen des Namens wird nicht
- angezeigt, es legt bloß die Sortierung fest.
- cchName : Länge des Puffers für achName
- achDesc : Beschreibung des Schoners, bis max. ca. 8 Zeilen a 30 Zeichen
- Beschreibung kann #10 (\n) (Zeilenvorschub) enthalten
- cchDesc : Länge des Puffers für Beschreibung
- }
-
- Procedure ScreenSaverID (var wMagic:integer;
- var fFunctions:LongInt;
- achName:pchar;
- cchName:integer;
- achDesc:pchar;
- cchDesc:integer);
- export;
- begin
- wMagic := $6874;
- fFunctions := 16+8+1; { 1: about, 2:options, 3:both }
- { 4: non-blank (nicht-leerer bildschirm erforderlich }
- { 8: hinterlΣ▀t leeren bildschirm }
- StrLCopy (achName, 'zBlackness', cchName - 1);
- { das erste zeichen des namens wird nicht angezeigt, es legt
- lediglich die sortierung fest. }
- {$ifdef ENGLISH}
- StrLCopy (achDesc, 'Blackness:'#10#10'Simply blanks the screen!'#10#10''#10,
- cchDesc - 1);
- {$else}
- StrLCopy (achDesc, 'Blackness:'#10#10'Macht den Bildschirm schwarz'#10#10'Beispiel eines einfachen Screen Savers'#10,
- cchDesc - 1);
- {$endif}
- end;
-
- { ScreenSaverOptions - der uebergebene Fensterhandle sollte als ParentWindow
- für die Dialogbox benutzt werden }
- Procedure ScreenSaverOptions (window: hWND);
- export;
- begin
- end;
-
-
- { ScreenSaverAbout - Parameter wie bei ScreenSaverOptions }
- Procedure ScreenSaverAbout (window: hWND);
- export;
- begin
- {$ifdef ENGLISH}
- {$ifdef SHARE}
- LgdAboutBox (window, 0,
- 'Blackness',
- '⌐1992-95 Thomas H÷vel Software'#10+
- 'Saturnstr. 45, 53842 Troisdorf, Germany'#10+
- 'All Rights reserved!',
- FALSE, 3);
- {$else}
- LgdAboutBox (window, 0,
- 'Blackness',
- '⌐1992-95 Thomas H÷vel Software'#10+
- 'Saturnstr. 45, 53842 Troisdorf, Germany'#10+
- 'All Rights reserved!',
- TRUE, 3);
- {$endif}
- {$else}
- {$ifdef SHARE}
- LgdAboutBox (window, 0,
- 'Blackness',
- '⌐1992-95 Thomas H÷vel Software'#10+
- 'Saturnstra▀e 45, 53842 Troisdorf, Deutschland'#10+
- 'Alle Rechte vorbehalten!',
- FALSE, 3);
- {$else}
- LgdAboutBox (window, 0,
- 'Blackness',
- '⌐1992-95 Thomas H÷vel Software'#10+
- 'Saturnstra▀e 45, 53842 Troisdorf, Deutschland'#10+
- 'Alle Rechte vorbehalten!',
- TRUE, 3);
- {$endif}
- {$endif}
-
- (*
- {$ifdef ENGLISH}
- messagebox (window, 'Saver module for ''The Lights Go Down'''#10'(C) 1992 Leo Minor', 'Blackness', mb_Ok or mb_ApplModal);
- {$else}
- messagebox (window, 'Beispiel zu ''The Lights Go Down'''#10'(C) 1992 Leo Minor', 'Blackness', mb_Ok or mb_ApplModal);
- {$endif}
- *)
- end;
-
- {$ifndef RUN}
- exports
- ScreenSaverID index 17,
- ScreenSaverOptions index 18,
- ScreenSaver index 19,
- ScreenSaverAbout index 20;
- {$endif}
-
- begin
- {$ifdef RUN}
- ScreenSaver (20, 0); { demo fⁿr ca. 20 sekunden }
- {$endif}
- end.
-